﻿#define _CRT_SECURE_NO_WARNINGS 1
#include"contact.h"
//初始化通讯录，将其全部初始化为0
void Init_Contact(contact* pc)
{
	assert(pc);

	memset(pc, 0, sizeof(pc));
	pc->sz = 0;

}
//增加联系人函数
void Add_Contact(contact* pc)
{
	assert(pc);//断言
	if (pc->sz == Max)//先判断是否已经存储满了
	{
		printf("联系人已满，无法添加\n");
		return;  //满了就退出该函数                  
	}
	else //没满，就进行联系人的增加
	{
		printf("请输入姓名：");
		scanf("%s", pc->data[pc->sz].name);
		printf("请输入年龄：");
		scanf("%d", &(pc->data[pc->sz].age));
		printf("请输入性别：");
		scanf("%s", pc->data[pc->sz].sex);
		printf("请输入电话：");
		scanf("%s", pc->data[pc->sz].tele);
		printf("请输入地址：");
		scanf("%s", pc->data[pc->sz].addr);

		pc->sz++;//增加联系人完毕，sz也要+1
		printf("成功增加联系人\n");
	}

}
//展示联系人函数
void Show_Contact(const contact* pc)
{
	assert(pc);//断言
	if (pc->sz == 0)//先判断通讯录有没有联系人
	{
		printf("没有联系人，无法展示\n");
		return;//没有联系人就退出该函数
	}
	else //有联系人，就进行展示（打印）
	{
		//先打印标题，方便用户观看
		printf("%-10s\t%-4s\t%-5s\t%-12s\t%-30s\n", "姓名", "年龄", "性别", "电话", "地址");
		//创建一个循环，打印所有的联系人
		int i = 0;
		for (i = 0; i < pc->sz; i++)
		{
			printf("%-10s\t%-4d\t%-5s\t%-12s\t%-30s\n",
				pc->data[i].name,
				pc->data[i].age,
				pc->data[i].sex,
				pc->data[i].tele,
				pc->data[i].addr);
		}
	}
}
//查找是否存在该用户的函数
int Find_Name(contact* pc, char name[])
{
	int i = 0;
	for (i = 0; i < pc->sz; i++)//循环，通过strcmp函数进行比对查找
	{
		if (strcmp(pc->data[i].name, name) == 0)
			return i;//找到了，就返回i，此刻i就是该联系人的下标
	}
	return -1;//找不到就返回-1
}
//删除联系人函数
void Del_Contact(contact* pc)
{
	assert(pc);//断言
	if (pc->sz == 0)//先判断通讯录有没有联系人
	{
		printf("通讯录中没有联系人，无法删除\n");
		return;//一个联系人都没有，就退出该函数
	}
	//再判断该联系人是否存在
	char name[Max_Name] = { 0 };
	printf("请输入要删除人的名字\n");
	scanf("%s", name);
	int del = Find_Name(pc, name);//-----》会用到Find_Name函数
	if (del == -1)
	{
		printf("该联系人不存在\n");
		return;
	}
	else //该联系人存在，再进行删除
	{
		int i = 0;
		for (i = del; i < pc->sz; i++)
		{
			pc->data[i] = pc->data[i + 1];
		}
		pc->sz--;//删除完成，sz要-1
		printf("成功删除该联系人\n");

	}
}
//搜索联系人函数
void Search_Contact(const contact* pc)
{
	assert(pc);//断言
	if (pc->sz == 0)//先判断通讯录有没有联系人
	{
		printf("通讯录中没有联系人，无法查找\n");
		return;//一个联系人都没有，就退出改函数
	}
	//通讯录有联系人，再去搜索是否存在该联系人
	char name[Max_Name] = { 0 };
	printf("请输入要查找人的名字\n");
	scanf("%s", name);
	int search = Find_Name(pc, name);//-----》会用到Find_Name函数
	if (search == -1)
	{
		printf("该联系人不存在\n");
		return;
	}
	else//该联系人存在，对其进行打印即可
	{
		printf("%-10s\t%-4s\t%-5\t%-12s\t%-30s\n", "姓名", "年龄", "性别", "电话", "地址");
		printf("%-10s\t%-4d\t%-5\t%-12s\t%-30s\n",
			pc->data[search].name,
			pc->data[search].age,
			pc->data[search].sex,
			pc->data[search].tele,
			pc->data[search].addr);
	}
}
//修改联系人函数
void Modify_Contact(contact* pc)
{
	assert(pc);//断言
	if (pc->sz == 0)//先判断通讯录有没有联系人
	{
		printf("通讯录中没有联系人，无法修改\n");
		return;//一个联系人都没有，就退出改函数
	}
	//通讯录有联系人，再去搜索是否存在该联系人
	char name[Max_Name] = { 0 };
	printf("请输入要修改人的名字\n");
	scanf("%s", name);
	int modify = Find_Name(pc, name);
	if (modify == -1)
	{
		printf("该联系人不存在\n");
		return;
	}
	else//该联系人存在，对其进行修改即可
	{
		printf("请输入修改后的姓名：");
		scanf("%s", pc->data[modify].name);
		printf("请输入修改后的年龄：");
		scanf("%d", &(pc->data[modify].age));
		printf("请输入修改后的性别：");
		scanf("%s", pc->data[modify].sex);
		printf("请输入修改后的电话：");
		scanf("%s", pc->data[modify].tele);
		printf("请输入修改后的地址：");
		scanf("%s", pc->data[modify].addr);

		printf("成功修改该联系人\n");
	}
}
//清空所有联系人函数
void Clean_Contact(contact* pc)
{
	assert(pc);
	pc->sz = 0;
	printf("联系人已经清空\n");
}
//按名字排序联系人函数
void Sort_Contact(contact* pc)
{
	assert(pc);
	qsort(pc->data, pc->sz, sizeof(pc->data[0]), cmp_name);
	printf("已经按照姓名排序完成\n");
}
int cmp_name(const void* p1, const void* p2)
{
	return strcmp(((contact*)p1)->data->name, ((contact*)p2)->data->name);

}